<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>

</body>
<script>
	// 1
	// Function.prototype.myCall = function(arg){
	// 	// 1- 如果接收的第一个参数是undefined,null,那么将this指定为window
	// 	// 2- 如果接收的第一个参数是包装类型,那么将this指定为包装对象
	// 	// 3- 如果接收的第一个参数是引用类型,那么将this指定为该引用类型的值
	// 	// 已知：当前this指向的是fn
	// 	// const obj = {
	// 	// 	content:this
	// 	// }
	// 	// obj.content();// ===>调用fn
	// 	// window.content = this;
	// 	// window.content();
	//
	// 	let content;// 最终执行fn函数内的this
	// 	// console.log("undefined",arg === undefined)
	// 	// console.log("null",arg === null)
	// 	if(arg === undefined || arg === null){
	// 		content = window;
	// 	}else if(typeof arg === "object" && typeof arg === "function"){
	// 		content = arg;
	// 	}else{
	// 		content = new Object(arg);
	// 	}
	// 	// 执行this(fn),并将this(fn)内的this指向为content
	// 	// 可以将this(fn)作为content对象下的属性（xxx）===》content.xxx()
	// 	const key = Math.random().toString(36).slice(2);// xxx
	// 	content[key] = this;// window.xxx = this
	// 	content[key]();// window.xxx();
	// 	delete content[key];
	// }
	// function fn(){
	// 	console.log(this);
	// }
	// fn.myCall(null);
	// fn.myCall(undefined);
	// fn.myCall({});
	// fn.myCall([]);
	// fn.myCall(1);
	// fn.myCall(function(){});
	
	
	// 2
	// Function.prototype.myCall = function(content){
	// 	if(content === undefined || content === null){
	// 		content = window;
	// 	}else if(typeof content !== "object" && typeof content !== "function"){
	// 		content = new Object(content);;
	// 	}
	// 	// 生成一个属性名，值为随机的字符串
	// 	const key = Math.random().toString(36).slice(2);
	// 	// 为content对象增加属性：属性名字为key的值，属性值为this(fn)
	// 	content[key] = this;
	// 	// content[key](1,2,3)
	// 	// console.log(111111,"content[key]("+Array.from(arguments).slice(1).join(",")+")");//
	// 	eval("content[key]("+Array.from(arguments).slice(1).join(",")+")");
	// 	delete content[key];
	// }
	// function fn(a,b,c,d){
	// 	console.log(this,a,b,c,d);
	// }
	// fn.myCall({},1,2,3,4);
	
	
	Function.prototype.myCall = function(content,...arg){
		if(content === undefined || content === null){
			content = window;
		}else if(typeof content !== "object" && typeof content !== "function"){
			content = new Object(content);;
		}
		// 生成一个属性名，值为随机的字符串
		const key = Math.random().toString(36).slice(2);
		// 为content对象增加属性：属性名字为key的值，属性值为this(fn)
		content[key] = this;
		content[key](...arg);
		delete content[key];
	}
	function fn(a,b,c,d){
		console.log(this,a,b,c,d);
	}
	fn.myCall({},1,2,3,4);
	
	
</script>
</html>